package com.gs;

import java.sql.SQLException;
import java.util.GregorianCalendar;

import android.content.Context;
import android.view.Menu;

import com.gs.business.cache.CacheCategorie;
import com.gs.domain.CatSpese;
import com.gs.domain.Gruppi;
import com.gs.domain.Utenti;
import com.gs.domain.wrapper.WrapCatSpese;
import com.gs.domain.wrapper.WrapGruppi;
import com.gs.view.OptionMenu;
import comi.gsi.ControlloreBase;
import comi.gsi.command.AbstractCommand;

public class Controllore extends ControlloreBase {

	private static Controllore singleton;
	private static int anno = new GregorianCalendar().get(GregorianCalendar.YEAR);
	public static Utenti utenteLogin;
	private static Menu optionsMenu;
	private static OptionMenu creatorOptionsMenu;

	public static Controllore getSingleton() {
		if (singleton == null) {
			synchronized (Controllore.class) {
				if (singleton == null) {
					singleton = new Controllore();
				}
			}
			singleton = new Controllore();
		}
		return singleton;
	}

	@Override
	public void setStartUtenteLogin(final Context context) {
		//		final Intent i = new Intent(context, Login.class);
		//		context.startActivity(i);
	}

	/**
	 * Controlla se esistono sul db le categorie, altrimenti le crea...
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws SQLException 
	 */
	public static void setStartCategorie() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {

		if (CacheCategorie.getSingleton().getVettoreCategorie().size() == 0) {
			final Gruppi gruppo = new Gruppi();
			gruppo.setnome("Gruppo default");
			gruppo.setdescrizione("default");
			new WrapGruppi().insert(gruppo);
			final CatSpese categoriaAltro = new CatSpese();
			categoriaAltro.setnome("Altro");
			categoriaAltro.setdescrizione("Categoria per spesa non definita");
			categoriaAltro.setGruppi(gruppo);
			categoriaAltro.setimportanza(CatSpese.IMPORTANZA_VARIABILE);

			final CatSpese categoriaFood = new CatSpese();
			categoriaFood.setnome("Cibo");
			categoriaFood.setdescrizione("Spesa per cibo");
			categoriaFood.setGruppi(gruppo);
			categoriaFood.setimportanza(CatSpese.IMPORTANZA_VARIABILE);

			final CatSpese categoriaAffitto = new CatSpese();
			categoriaAffitto.setnome("Affitto");
			categoriaAffitto.setdescrizione("Spesa per Affitto mensile casa");
			categoriaAffitto.setGruppi(gruppo);
			categoriaAffitto.setimportanza(CatSpese.IMPORTANZA_FISSO);

			final CatSpese categoriaBollette = new CatSpese();
			categoriaBollette.setnome("Bollette");
			categoriaBollette.setdescrizione("Spesa per luce, gas, ecc...");
			categoriaBollette.setGruppi(gruppo);
			categoriaBollette.setimportanza(CatSpese.IMPORTANZA_FISSO);

			final CatSpese categoriaPersonali = new CatSpese();
			categoriaPersonali.setnome("Personali");
			categoriaPersonali.setdescrizione("Spese per il benessere personale");
			categoriaPersonali.setGruppi(gruppo);
			categoriaPersonali.setimportanza(CatSpese.IMPORTANZA_FUTILE);

			final WrapCatSpese wrap = new WrapCatSpese();
			wrap.insert(categoriaAffitto);
			wrap.insert(categoriaPersonali);
			wrap.insert(categoriaBollette);
			wrap.insert(categoriaFood);
			wrap.insert(categoriaAltro);
		}

	}

	public static OptionMenu getCreatorOptionsMenu(final Menu menu) {
		if (creatorOptionsMenu == null) {
			creatorOptionsMenu = new OptionMenu(menu);
		}
		return creatorOptionsMenu;
	}

	public static Menu getOptionsMenu(final Menu menu) {
		if (optionsMenu == null) {
			OptionMenu menuCreator = getCreatorOptionsMenu(menu);
			optionsMenu = menuCreator.getMenu();
		}
		return optionsMenu;
	}

	public static boolean invocaComando(final AbstractCommand comando) {
		return Controllore.getSingleton().getCommandManager().invocaComando(comando);
	}

	@Override
	public void verificaPresenzaDb() {
	}

	public static int getAnno() {
		return anno;
	}

	public static void setAnno(final int anno) {
		Controllore.anno = anno;
	}

	public static Utenti getUtenteLogin() {
		return utenteLogin;
	}

	public static void setUtenteLogin(final Utenti utenteLogin) {
		Controllore.utenteLogin = utenteLogin;
	}

}
